#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <vector>

// /* 1. 线程异常 */

// void *routinue1(void *args)
// {
//     int cnt = 3;
//     while(cnt--)
//     {
//         std::cout << "我是新线程, 我的name:" << (char*)args << std::endl;
//         sleep(1);
//     }
//     /* 野指针操作--> 异常 */
//     int* p = nullptr;
//     *p = 100;
//     return nullptr;
// }

// void *routinue2(void *args)
// {
//     int cnt = 3;
//     while(cnt--)
//     {
//         std::cout << "我是新线程, 我的name:" << (char*)args << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     /* 创建两个线程 */
//     pthread_t tid1, tid2;

//     pthread_create(&tid1, nullptr, routinue1, (void*)"thread-1");
//     pthread_create(&tid2, nullptr, routinue2, (void*)"thread-2");

//     while(true)
//     {
//         std::cout << "我是主线程, 我的pid:" << getpid() << std::endl;
//         sleep(1);
//     }

//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);
//     return 0;
// }

// /* 2. 线程函数共享 */
// /* 将tid转换为16进制 */
// std::string toHex(pthread_t tid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", tid);
//     return buffer;
// }

// /* 可重入函数 */
// void *routinue(void *args)
// {
//     std::string name = static_cast<char*>(args);
//     while(true)
//     {
//         sleep(1);
//         std::cout << "我是新线程, 我的name:" << name << ",我的tid:"  << toHex(pthread_self()) << std::endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     /* 创建两个线程 */
//     pthread_t tid1, tid2;

//     pthread_create(&tid1, nullptr, routinue, (void*)"thread-1");
//     pthread_create(&tid2, nullptr, routinue, (void*)"thread-2");

//     while(true)
//     {
//         std::cout << "我是主线程, 我的pid:" << getpid() << std::endl;
//         sleep(1);
//     }

//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);

//     return 0;
// }


/* 将tid转换为16进制 */
// 线程局部存储
// 编译型关键字，给每个线程来一份
// 虽然用的是同一份值和变量名，但是编译的时候把它地址编程不同
// 此时就叫做线程局部存储
// 注意：__thread 只能修饰内置类型
// __thread int val = 100; // 此时主线程和新线程看到的地址不同

// std::string toHex(pthread_t tid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", tid);
//     return buffer;
// }

// /* 可重入函数 */
// void *routinue1(void *args)
// {
//     std::string name = static_cast<char*>(args);
//     while(true)
//     {
//         sleep(1);
//         std::cout << "我是新线程, 我的name:" << name << ",我的tid:"  << toHex(pthread_self()) << "全局变量(会修改):" << val << std::endl;
//         ++val;
//     }
//     return nullptr;
// }

// /* 可重入函数 */
// void *routinue2(void *args)
// {
//     std::string name = static_cast<char*>(args);
//     while(true)
//     {
//         sleep(1);
//         std::cout << "我是新线程, 我的name:" << name << ",我的tid:"  << toHex(pthread_self()) << "全局变量(观察):" << val << std::endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     /* 创建两个线程 */
//     pthread_t tid1, tid2;

//     pthread_create(&tid1, nullptr, routinue1, (void*)"thread-1");
//     pthread_create(&tid2, nullptr, routinue2, (void*)"thread-2");

//     while(true)
//     {
//         std::cout << "我是主线程, 我的pid:" << getpid() << std::endl;
//         sleep(1);
//     }

//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);

//     return 0;
// }


// /* 线程分离 */
// void *routine(void *args)
// {
//     std::cout << "我是新线程, 我的tid:" << pthread_self() << std::endl;
//     std::cout << "我要开始分离了!" << std::endl;
//     sleep(1);
//     pthread_detach(pthread_self());
//     return 0;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routine, (void*)"thread-1");

//     int n = pthread_join(tid, nullptr);
//     std::cout << n << std::endl;
//     return 0;
// }

// /* 创建多线程 */
// // /* 将tid转换为16进制 */
// std::string toHex(pthread_t tid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", tid);
//     return buffer;
// }

// /* 可重入函数 */
// void *routinue(void *args)
// {
//     std::string name = static_cast<char*>(args);
//     sleep(1);
//     std::cout << "我是新线程, 我的name:" << name << ",我的tid:"  << toHex(pthread_self())  << std::endl;
//     return nullptr;
// }

// int main()
// {
//     /* vector 管理起来线程tid */
//     std::vector<pthread_t> v;
//     for(int i = 0; i < 10; ++i)
//     {
//         pthread_t tid;
//         // char buffer[64]; // 会导致线程安全问题，多个线程访问的是同一资源，资源不一致
//         char* buffer = new char[64];
//         snprintf(buffer, 64, "thread-%d", i);
//         pthread_create(&tid, nullptr, routinue, (void*)buffer);
//         v.push_back(tid);
//     }

//     for(auto& e : v)
//     {
//         int n = pthread_join(e, nullptr);
//         if(n == 0)
//             std::cout << "join success!" << std::endl;
//     }
//     return 0;
// }

